#!/bin/bash

#####################################################
#                                                   #
#	       Visualizador de logs		    #
#	    de la aplicación Consultar              #
#                                                   #
#   TP Sistemas Operativos - UBA - 2do Cuat. 2011   #
#                                                   #
#####################################################

LOGDIR=../logdir
LOGEXT=log
MAXLOGSIZE=1

#Códigos de error
ERROR_PARAM=1
ERROR_TIPO_MENS=2
ARCH_INEXISTENTE=3
DIR_INEXISTENTE=4
ERROR_MAX_LINEAS=5

max_log_size=$(expr $MAXLOGSIZE \* 1024)
nombre=$0

function mostrar_help {
	echo
	echo "Uso: $nombre -<opcion> parametro"
	echo "	-h: muestra esta ayuda"
	echo "	-c <comando>: comando a buscar (obligatorio)"
	echo "	-t <[I-A-E-SE]>: tipo de mensaje"
	echo "	-s <cadena>: cadena que deben contener las lineas del resultado"
	echo "	-n <num>:	cantidad de lineas a leer del archivo de log."
	echo "			Si a continuacion se especifica -min <num>, se leera desde ese minimo"
	echo "			tantas lineas como -n indique. Por defecto lee las ultimas -n lineas"
	echo "	-o <archivo>: especifica la ruta del archivo de salida para guardar la consulta."
	echo
}

echo
echo "********************* VISUALIZADOR DE LOGS ********************"
echo

comando=""
min_linea=-1
max_lineas=-1
filtro_default="[A,E,I,E,SE]"
filtro_tipo=$filtro_default
filtro_string=""
filtro_fecha=""
archivo_output=""

while (( $# ))
do
	case $1 in
		-h ) 
			mostrar_help
			exit 0
	;;
		-c ) 	comando=$2
	;;
		-n )
			max_lineas=$2
			if [ "-m" == "$3" ]
			then
				min_linea=$4
			fi
	;;
		-t ) 	
			filtro_tipo=$2
	;;
		-s ) 	
			filtro_string="$2"
			echo "Seleccionado filtro para mostrar mensajes que conetengan el string '"$filtro_string"'."
	;;
		-f ) 	
			filtro_fecha=$2
			echo "Seleccionado filtro para mostrar mensajes desde la fecha $2."
	;;
		-o )	
			archivo_output=$2
			echo "Seleccionado archivo de salida $2..."
	;;

		"" ) 
			mostrar_help
			exit $ERROR_PARAM

		;;
	esac

	shift
done

if [ "$comando" == "" ] 
then
	echo "No se especifico ningún comando a buscar!" >&2
	echo
	mostrar_help
	exit $ERROR_PARAM
fi
#Verificar si existen los directorios y/o archivos
filename="$comando.$LOGEXT"
filepath="$LOGDIR/$filename"
if [ ! -f $filepath ]
then
	echo "El archivo de log $filename no existe." >&2
	exit $ARCH_INEXISTENTE
fi

if [ "$archivo_output" != "" ] && [ ! -f $archivo_output ]
then
	touch $archivo_output
fi

lineas=`cat $filepath | wc -l`

#Comprobación de parámetros
if [ $min_linea -eq "-1" ]
then
	if [ "0" -ge $max_lineas ]
	then
		max_lineas=$lineas;
	else
		echo "Seleccionado filtro mostrar últimas $max_lineas lineas."
	fi
	min_linea=$(expr $lineas - $max_lineas + 1)
else
	echo "Seleccionado filtro mostrar $max_lineas lineas, contando desde linea $min_linea."
fi

max_linea=$(($min_linea + $max_lineas))


if [ "$filtro_tipo" != "$filtro_default" ] && [ "$filtro_tipo" != "I" ] && [ "$filtro_tipo" != "A" ] && [ "$filtro_tipo" != "E" ] && [ "$filtro_tipo" != "SE" ]
then
	echo "Tipo de mensaje invalido!" >&2
	mostrar_help
	exit $ERROR_TIPO_MENS
else
	if [ "$filtro_tipo" != "$filtro_default" ]
	then
		echo "Seleccionado filtro de tipo de mensaje, el mensaje puede ser de tipo: $filtro_tipo "
	fi
fi

echo
echo "Lineas"
echo

#Aplicar filtros
aux=$IFS
IFS='
'

for linea in `sed -n $min_linea,"$max_linea"p $filepath`;
do

	if [ "$filtro_tipo" == "$filtro_default" ]
	then
		echo $linea | grep ".*$filtro_string.*"
		if [ $archivo_output ]
		then
			echo $linea | grep ".*$filtro_string.*" >> $archivo_output
		fi

	else
		echo $linea | grep ".*\[$filtro_tipo\].*$filtro_string.*"
		if [ $archivo_output ]
		then
			echo $linea | grep ".*\[$filtro_tipo\].*$filtro_string.*" >> $archivo_output
		fi
	fi

done

echo
if [ $archivo_output ]
then
	echo
	echo "Exportado a $archivo_output"
fi

echo
exit 0
